//
//  HHAudioPlayer.h
//  Pod
//
//  Created by chun.chen on 2018/4/21.
//  Copyright © 2018年 Zhihan. All rights reserved.
//  提供一个可以播放本地,网路MP3等格式的播放控制
//  网络音频统一缓存在documents/com.huihui.chat.audioCache目录下
//  播放流程
//  传入URLString,index->检测是否有正在加载,正在播放的音频(停止加载,停止播放)->检查URLString是本地还是网络路径(网络路径下载到本地,并且缓存到本地目录下)->开始播放加载到的audioData->播放结束

#import <Foundation/Foundation.h>
#import "HHAudioDefine.h"

NS_ASSUME_NONNULL_BEGIN

@class HHAudioPlayer;

@protocol HHAudioPlayerDelegate <NSObject>

@optional


/// 开始播放音频的回调
/// @param player player description
/// @param error 错误信息
- (void)playAudio:(HHAudioPlayer *)player didBeganWithError:(nullable NSError *)error;

/// 播放器播放状态变化
/// @param player player description
/// @param state 状态
- (void)playAudio:(HHAudioPlayer *)player stateDidChanged:(HHAudioPlayState )state;

/// 播放完音频的回调
/// @param player player description
/// @param flag flag description
- (void)audioPlayerDidFinishPlaying:(HHAudioPlayer *)player successfully:(BOOL)flag;

///  更新播放时间
/// @param duration 当前播放的时长
- (void)audioPlayerUpdateDuration:(NSTimeInterval )duration;

///  音频信号量变化
/// @param singnalPower 变化的值
- (void)audioPlayerSignalPowerDidChange:(CGFloat )singnalPower;

@end

@interface HHAudioPlayer : NSObject


/**
 是否监听音量信号
 */
@property (nonatomic, assign) BOOL isOpenSignal;

/**
 监听音量的间隔时间
 */
@property (nonatomic, assign) CGFloat signalTime;

/**
 音频播放地址
 */
@property (nonatomic, copy, nullable) NSString *URLString;

/**
 *  identifier -> 主要作用是提供记录,用来控制对应的tableViewCell的状态
 */
@property (nonatomic, copy, nullable) NSString *identifier;

/**
 *  当前播放器播放的状态,当tableView滚动时,匹配index来设置对应的audioPlayerState
 */
@property (nonatomic, assign) HHAudioPlayState audioPlayerState;


/**
 当前播放的总时长
 */
@property(nonatomic, assign, readonly) NSTimeInterval duration;

/**
 单例

 @return self
 */
+ (instancetype)sharePlayer;


/**
 播放

 @param URLString 音频地址 支持本地和url
 @param identifier 播放的标识符
 */
- (void)playAudioWithURLString:(NSString *_Nullable)URLString identifier:(NSString *_Nullable)identifier;


/**
 停止播放
 */
- (void)stopAudioPlayer;


/**
 取消播放
 */
- (void)cleanAudioCache;

/**
 重置播放器
 */
- (void)resetAudioPlayer;

/**
 暂停
 */
- (void)pause;

/**
 继续播放
 */
- (void)resumePlay;


/**
 指定播放时间

 @param time time description
 @return return value description
 */
- (BOOL)playAtTime:(NSTimeInterval)time;

#pragma mark - help
/**
  获取音频url的时长

 @param URLString url地址
 @param finished finished description
 */
- (void)obtainDurationWithURLString:(NSString *_Nullable)URLString finished:(void (^_Nullable)(float duration))finished;

/// 获取音频类型
/// @param URLString URLString description
- (HHAudioMediaType)mediaTypeWithUrl:(NSString *)URLString;

/// 缓存语音
/// @param localPath 本地路径
/// @param URLString 远程路径
- (BOOL)saveCache:(NSString *)localPath forUrl:(NSString *)URLString;

#pragma mark - 绑定和解绑方法
/**
 * 绑定监听
 *
 * @param delegate 监听者
 */
- (void)bind:(_Nullable id<HHAudioPlayerDelegate>)delegate;

/**
 * 解绑监听
 *
 * @param delegate 业务线的delegate
 */
- (void)unbind:(_Nullable id<HHAudioPlayerDelegate>)delegate;

@end

NS_ASSUME_NONNULL_END
